import {AstVisitor, Prog, FunctionCall, FunctionDecl, FunctionBody} from './nast';

/////////////////////////////////////////////////////////////////////////
// 解释器

/**
 * 遍历AST，执行函数调用。
 */
export class Intepretor extends AstVisitor{
    visitProg(prog:Prog):any{
        let retVal:any;

        //执行所有的函数调用
        for(let x of prog.stmts){
            let functionCall = x as FunctionCall;
            if (typeof functionCall.parameters === 'object'){
                retVal = this.runFunction(functionCall);
            }
        };
        return retVal;
    }

    //执行一个函数体
    visitFunctionBody(functionBody:FunctionBody):any{
        let retVal:any;

        //依次执行每条函数调用
        for(let x of functionBody.stmts){
            retVal = this.runFunction( x);
        };
    }

    //执行一个函数
    private runFunction(functionCall:FunctionCall){
        if (functionCall.name.startsWith("nl.")){
            //内置函数
            if(functionCall.name == "nl.println"){
                if(functionCall.parameters.length>0){
                    console.log(functionCall.parameters[0]);
                }
                else{
                    console.log("undefined sys func:"+functionCall.name);
                }
                return 0;
            }
        }
        else{
            //自定义函数 
            //找到函数定义，继续遍历函数体
            if (functionCall.definition !=null){
                this.visitFunctionBody(functionCall.definition.body);
            }
            else{
                console.log(functionCall.name + " not found!!!");
            }
        }
    }
}
